package chpt05;

import java.time.LocalDateTime;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ScheduledTest {

	public static void main(String[] args) {
		String format = "mm:ss";
		TimePrinter tp = new TimePrinter(format);
		int delay = 5;
		int duration = 20; // 演示持续时间
		// 创建一个包含3个线程的执行器
		ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(3);
		
		System.out.println("演示于"+LocalDateTime.now()+"开始。");
		System.out.println("演示将持续"+duration+"秒。");
		/*演示1： 延迟3秒开始执行，只执行一次。*/
		executor.schedule(tp, 3, TimeUnit.SECONDS);
		
		/*演示2：延迟1秒开始执行，每隔delay秒执行一次。*/

		System.out.println("演示 " + LocalDateTime.now() + " 开始！每隔" + delay + "秒执行一次");
		/* 演示1： 延迟0秒开始执行，只执行一次。 */
		// executor.schedule(tp, 0, TimeUnit.SECONDS);

		/* 演示2：延迟1秒开始执行，每隔delay秒执行一次。 */
		// 当前任务执行完，下次任务在上次任务结束后再执行。
		// 每次任务执行时间点 = 上一次开始时间点 + 任务持续时间 + delay
		// executor.scheduleWithFixedDelay(tp, 1, delay, TimeUnit.SECONDS);

		/* 演示3：延迟1秒开始执行，执行周期是delay秒。 */
		// 每次任务执行时间点 = 上一次开始时间 + dealy
		executor.scheduleAtFixedRate(tp, 1, delay, TimeUnit.SECONDS);

		// duration秒后关闭关闭执行器，演示结束
		try {
			TimeUnit.SECONDS.sleep(duration); 
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		executor.shutdown(); // 关闭executor中的任务
		System.out.println("演示于"+LocalDateTime.now()+"结束。");

	}
}
